#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <signal.h>
#include <string.h>
#include <strings.h>
#include <stdbool.h>
#include <pthread.h>
#include <semaphore.h>

#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/fb.h>
#include <linux/un.h>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>

#include "common.h"
#include "cJSON.h"

char *httprequest()
{
	printf("你要查哪个城市天气？（输入中文或拼音）\n");
	char city[20];	
	bzero(city, 20);
	fgets(city, 20, stdin);

	static char request[1024];

	snprintf(request, 1024, "GET /v3/weather/now.json?key=SAewqnjWlC7dvMLfL&location=%s&language=zh-Hans&unit=c HTTP/1.1\r\n"
			        "Host:api.seniverse.com\r\n\r\n", strtok(city, "\n"));

	return request;
}

void parse(char *res, int *ok, int *len)
{
	char *retcode = res + strlen("HTTP/1.x ");

	switch(atoi(retcode))
	{
	case 200 ... 299:
			*ok = 1;
			printf("查询成功\n");
			break;

	case 400 ... 499:
			*ok = 0;
			printf("客户端错误\n");
			exit(0);

	case 500 ... 599:
			*ok = 0;
			printf("服务端错误\n");
			exit(0);
	}

	char *p;
	if(p = strstr(res, "Content-Length: "))
	{
		*len = atoi(p + strlen("Content-Length: "));
	}
}

int main(int argc, char **argv)
{
	// 利用DNS服务查询指定域名的IP
	struct hostent *he = gethostbyname("api.seniverse.com");
	if(he == NULL)
	{
		perror("DNS查询失败");
		exit(0);
	}

	printf("IP: %s\n", inet_ntoa(*(struct in_addr*)((he->h_addr_list)[0])));

	struct sockaddr_in addr;
	socklen_t len = sizeof(addr);
	bzero(&addr, len);

	addr.sin_family = AF_INET;
	addr.sin_addr   = *(struct in_addr*)((he->h_addr_list)[0]);
	addr.sin_port   = htons(80);

	// 创建TCP套接字(因为HTTP是基于TCP的)，并发起连接
	int fd = Socket(AF_INET, SOCK_STREAM, 0);
	if(connect(fd, (struct sockaddr *)&addr, len) == 0)
	{
		printf("连接服务器成功！\n");
	}

	// 准备好HTTP的请求报文
	char *s = httprequest();
	write(fd, s, strlen(s));

<<<<<<< HEAD
	char *ss = calloc(1, 4096);
	read(fd, ss, 4096);
	printf("%s", ss);


	// // 接收对方的响应头部
	// char res[1024];
	// int total = 0;
	// while(1)
	// {
	// 	int n = read(fd, res+total, 1);

	// 	if(n <= 0)
	// 	{
	// 		perror("读取HTTP头部失败");
	// 		exit(0);
	// 	}

	// 	total += n;

	// 	if(strstr(res, "\r\n\r\n"))
	// 		break;
	// }
	// printf("response:\n%s", res);

	// // 分析响应码，并获取正文的长度
	// int ok, jsonlen=0;
	// char *json;
	// parse(res, &ok, &jsonlen);
	// printf("%d\n", jsonlen);
	// printf("%d\n", ok);
	// // if(!ok || jsonlen == 0)
	// {
	// 	// 一次性接收响应包体
	// 	json = calloc(1, jsonlen);
	// 	total = 0;
	// 	while(jsonlen > 0)
	// 	{
	// 		int n    = read(fd, json+total, jsonlen);
	// 		total   += n;
	// 		jsonlen -= n;
	// 		printf("n: %d\n", n);
	// 	}
	// 	printf("json:\n%s", json);
	// }
	// if(ok && jsonlen == -1)
	// {
	// 	// 按块接收响应包体
	// 	int bodyLen = 0;
	// 	int chunkSize;

	// 	while(1)
	// 	{
	// 		// 读取块大小
	// 		chunkSize = 0;
	// 		// if((chunkSize=readChunkSize(fd)) == 0)
	// 		// 	break;

	// 		// 扩展包体存储内存大小
	// 		bodyLen += chunkSize;
	// 		json = realloc(json, bodyLen);

	// 		jsonlen += read(fd, json+jsonlen, chunkSize);
	// 	}
	// }

	// cJSON *root = cJSON_Parse(json);
	// cJSON *body = cJSON_GetObjectItem(root, "showapi_res_body");
	// cJSON *now  = cJSON_GetObjectItem(body, "now");

	// printf("当前温度: %s°C\n", cJSON_GetObjectItem(now, "temperature")->valuestring);
=======
	// 接收对方的响应头部
	char res[1024];
	int total = 0;
	while(1)
	{
		int n = read(fd, res+total, 1);

		if(n <= 0)
		{
			perror("读取HTTP头部失败");
			exit(0);
		}

		total += n;

		if(strstr(res, "\r\n\r\n"))
			break;
	}

	// 分析响应码，并获取正文的长度
	int ok, jsonlen=0;
	parse(res, &ok, &jsonlen);
	char *json;
	if(ok && jsonlen > 0)
	{
		json = calloc(1, jsonlen);
		total = 0;
		while(jsonlen > 0)
		{
			int n    = read(fd, json+total, jsonlen);
			total   += n;
			jsonlen -= n;
		}
	}
	printf("json:\n%s", json);

	cJSON *root = cJSON_Parse(json);
	cJSON *results= cJSON_GetObjectItem(root, "results");
	cJSON *now;


	int size = cJSON_GetArraySize(results);
	for(int i=0; i<size; i++)
	{
		now = cJSON_GetObjectItem(cJSON_GetArrayItem(results, i), "now");

		char *wea = cJSON_GetObjectItem(now, "text")->valuestring;
		char *tmp = cJSON_GetObjectItem(now, "temperature")->valuestring;
		printf("天气: %s\n", wea);
		printf("温度: %s°C\n", tmp);
	}
>>>>>>> 28d8964084b6eace77787ca32bfb7eb99401676b

	return 0;
}

